#ifndef ATENCIONUSUARIO_H_
#define ATENCIONUSUARIO_H_

#include "Hilo.h"
#include "Socket.h"
#include "Clase.h"
#include "Curso.h"
#include "Mutex.h"
#include <fstream>
#include <string.h>
#include <iostream>
#include <ios>
#include <map>

class AtencionUsuario: public Hilo {
	Socket *socket, *socket_av;
	bool atendiendo;
	std::ifstream* arch_usuarios;
	// Clases individuales
	std::map<unsigned int, Clase*> *clases;
	// Cursos
	std::map<unsigned int, Curso*> *cursos;
	// Clases a las que se inscribio el alumno
	std::list<unsigned int> inscripcionesClases;
	// Cursos a los que se inscribio el alumno
	std::list<unsigned int> inscripcionesCursos;
	unsigned int codClase_a_iniciar;
	unsigned int codCurso_a_iniciar;
	Mutex *mutexClase;
	Mutex *mutexCurso;
	std::string nombre_usuario;
	std::string clave;
public:
	AtencionUsuario(int fd, int fd_av, std::ifstream* arch_usuarios,
			std::map<unsigned int, Clase*> *clases,
			std::map<unsigned int, Curso*> *cursos, Mutex *mutexClase, Mutex *mutexCurso);
	bool getAtendiendo();
	void crearClase();
	void run();
	virtual ~AtencionUsuario();
protected:
	void login(bool *profesor, bool *alumno, char cod_op, char **argumentos);
	bool iniciarClase();
	void terminarClase();
	void pausarClase();
	void continuarClase();
	void matarSockets();
	void pararAtencion();
	void cerrarClase();
	bool estadoClase(const unsigned int codClase);
	bool buscarClase(const unsigned int codClase);
	bool buscarCurso(const unsigned int codCurso);
	bool buscarInscripcion(unsigned int codClase);
	void inscribirAlumno(const unsigned int codigo, bool curso);
	void inscripcionClase(char **argumentos);
	bool inscripcionCurso(char **argumentos);
	bool verificarInscripcion(std::string nombre_usuario, std::string clave,
			char cod_op);
	bool CrearCurso(const unsigned int cod_Curso, const std::string descripcion);
	bool CrearClase(const unsigned int cod_Clase, const std::string descripcion, const char disponibilidad);
	bool AnadirClase(const unsigned int cod_Curso, const unsigned int cod_Clase,
			const std::string descripcion, const char disponibilidad);
	bool IniciarClaseDeCurso(const unsigned int cod_Curso, const unsigned int cod_Clase);
	int avisar_inicio_a_alumnos();
	int avisar_fin_a_alumnos();
	int avisar_a_alumnos(char cod_op);
	unsigned int String_toInt(std::string str);
	std::string Int_toString(unsigned int entero);
	bool recibirInstrucciones(char **argumentos, char *cod_op,	bool profe,
			bool alumno, unsigned int *tam_arg);
	void separar_Argumentos(char **argumentos, unsigned int *codClase,
			unsigned int *codCurso, int tam_arg);
	bool enviarRespuesta(char cod1);
	int enviarCartelera();
	int enviarClasesIndiv();
	int enviarCursos();
	int enviarClasesDeCursos();
	int enviarCodDescrp(char cod_op, int tam_arg, std::string aux1, std::string aux2);
	int enviarVideosDisponibles();
	int enviarVideosDispClasesIndiv();
	int enviarVideosDispCursos();
	int enviarVideo(std::string codigo);
	std::string recibirNomArch(char* argumentos, unsigned int tam_arg,
			unsigned long tam_arch);
	int enviarAdjuntosDisponibles();
	int enviarAdjuntosDispClasesIndiv();
	int enviarAdjuntosDispCursos();
	int enviarAdjunto(std::string nom_arch);
};

#endif
